import typescript from '@rollup/plugin-typescript';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
import { readdirSync, statSync, mkdirSync } from 'fs';
import { join, dirname, basename } from 'path';

// 源码根目录
const srcRoot = 'packages/core/src';
// 输出根目录
const distRoot = 'packages/core/dist';

/**
 * 创建通用配置函数
 * @param {string} input - 输入文件路径
 * @param {string} output - 输出文件路径
 * @param {string} format - 输出格式 (cjs, esm, umd)
 * @param {string} [name] - UMD格式的全局变量名
 * @returns {object} Rollup配置对象
 */
const createConfig = (input, output, format, name = undefined) => {
  // 确保输出目录存在
  mkdirSync(dirname(output), { recursive: true });

  return {
    input,
    output: {
      file: output,
      format,
      name,
      exports: 'named',
      sourcemap: false
    },
    plugins: [
      nodeResolve({
        browser: true
      }),
      commonjs(),
      // 禁用TypeScript插件的声明文件生成，我们将通过tsc单独生成
      typescript({
        tsconfig: './tsconfig.json',
        declaration: false,
        rootDir: srcRoot,
        sourceMap: false
      }),
      terser()
    ],
    external: ['lodash-es']
  };
};

/**
 * 简单直接地获取所有模块目录
 * @returns {Array<{dir: string, files: Array<string>}>} 模块目录和文件信息
 */
function getModuleDirectories() {
  const modules = [];
  const rootEntries = readdirSync(srcRoot);

  // 处理主入口文件
  modules.push({
    dir: srcRoot,
    files: ['index.ts']
  });

  // 处理子模块目录
  for (const entry of rootEntries) {
    const entryPath = join(srcRoot, entry);
    const stat = statSync(entryPath);

    if (stat.isDirectory()) {
      const moduleFiles = [];
      const moduleEntries = readdirSync(entryPath);

      // 收集该模块目录下的所有.ts文件
      for (const file of moduleEntries) {
        if (file.endsWith('.ts')) {
          moduleFiles.push(file);
        }
      }

      modules.push({
        dir: entryPath,
        files: moduleFiles
      });
    }
  }

  return modules;
}

/**
 * 生成所有构建配置
 * @returns {Array<object>} Rollup配置数组
 */
function generateConfigs() {
  const configs = [];
  const modules = getModuleDirectories();

  // 遍历所有模块
  for (const module of modules) {
    for (const file of module.files) {
      const inputPath = join(module.dir, file);
      const fileName = basename(file, '.ts');

      // 确定输出目录
      let outputDir = distRoot;
      // 如果不是根目录的文件，需要创建对应的子目录
      if (module.dir !== srcRoot) {
        const moduleName = basename(module.dir);
        outputDir = join(distRoot, moduleName);
      }

      // 确定输出文件名
      let outputFileName = fileName;
      // 移除原来将子模块index文件映射为模块名的逻辑
      // 现在所有文件都使用其原始文件名（不包括扩展名）作为输出文件名
      // 这样others/index.ts会生成index.esm.js而不是others.esm.js

      // 主入口文件：生成UMD、CJS和ESM三种格式
      if (fileName === 'index' && module.dir === srcRoot) {
        // UMD格式
        configs.push(createConfig(inputPath, join(outputDir, `${outputFileName}.umd.js`), 'umd', 'FeProUtils'));
        // CJS格式
        configs.push(createConfig(inputPath, join(outputDir, `${outputFileName}.cjs.js`), 'cjs'));
        // ESM格式
        configs.push(createConfig(inputPath, join(outputDir, `${outputFileName}.esm.js`), 'esm'));
      } else {
        // 子模块文件：只生成ESM格式，以支持tree-shaking
        configs.push(createConfig(inputPath, join(outputDir, `${outputFileName}.esm.js`), 'esm'));
      }
    }
  }

  return configs;
}

export default generateConfigs();
